package com.uliky.shouyiLibrary.order.config;


import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Configuration
public class MyRabbitConfig {
    /**
     * 在容器中放一个消息转换器，将消息转化为json格式
     */
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    @Component
    public static class rabbitTemplateConfiguration {
        @Autowired
        private RabbitTemplate rabbitTemplate;
        /**
         * 定制rabbitTemplate
         */
        @PostConstruct //MyRabbitConfig创建完对象在执行此方法
        public void initRabbitTemplate() {
            //设置确认回调  发送者---交换机
            rabbitTemplate.setConfirmCallback(
                    new RabbitTemplate.ConfirmCallback() {
                        /**
                         * @param correlationData 当前数据的唯一关联数据(存放消息的唯一id)==在传递消息时可以通过参数创建correlationData，给消息一个唯一id
                         * @param b               ack -- 是否成功 --到达交换机
                         * @param s               cause -- 失败原因
                         */
                        @Override
                        public void confirm(CorrelationData correlationData, boolean b, String s) {
                            //对消息进行处理
                        }
                    }
            );
            //设置消息 交换机--队列回调   --消息没有投递给指定的队列触发回调
            rabbitTemplate.setReturnCallback(
                    new RabbitTemplate.ReturnsCallback() {
                        @Override
                        public void returnedMessage(ReturnedMessage returnedMessage) {
                            //Message message  失败的消息
                            //int replyCode      回复状态码
                            //String replyText  回复内容
                            //String exchange  消息发送到哪个交换机
                            //String routingKey  消息的routekey
                            // ReturnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey)
                            //对消息进行对应的回调处理
                        }
                    }
            );

        }

    }

}
